#ifndef CONFIG_HPP_
#define CONFIG_HPP_

#include <iostream>
#include <unordered_map>
#include <XLogger.hpp>
#include <yaml-cpp/yaml.h>

struct App {
	int status;			//0：离线 1：在线
	int pingCnt;        //
    std::string name;	//
    std::string file;	//
	std::string cmd;	//

	std::string log;	//
	std::string version;//
	std::string date;	//
};

class AppConfig {
public:
	AppConfig(const std::string& path): configPath_(path) {
		LOG_DEBUG("configPath: {}", configPath_);
		read(appList);
	}

	bool read(std::vector<App>& result) {
		if (configPath_.empty())
			return false;
		auto parseStr = [&](const YAML::Node &node, std::string &result) -> bool {
		  const auto &iterms = node;
		  if (!iterms.IsDefined()) {
			  return false;
		  }
		  if (iterms.IsNull()) {
			  result = "";   // 为空时默认填 ""
		  } else if (iterms.IsScalar()) {
			  result = iterms.as<std::string>();
		  }
		  return true;
		};

		try {

			// 加载 YAML 文档到 YAML::Node 对象 doc
			YAML::Node doc = YAML::LoadFile(configPath_);
			// 定位 apps 组
			if (doc["apps"]) {
				// 遍历每个 "app"
				for (const auto& appNode : doc["apps"]) {
					App app;
					parseStr(appNode["name"], app.name);
					parseStr(appNode["file"], app.file);
					parseStr(appNode["cmd"], app.cmd);
					app.status = 0;	//离线
					app.pingCnt = 0;	//离线
					app.log = "";
					app.version = "";
					app.date = "";
					result.push_back(app);
				}
			} else {
				std::cout << "apps 组未找到或为空" << std::endl;
			}
			return true;
		} catch (const YAML::Exception& e) {
			// 捕获 YAML 异常，并进行错误处理
			std::cerr << "YAML parsing error: " << e.what() << std::endl;
			return false; // 或者抛出异常等其他错误处理方式
		}
	}

	void print() {
		for (const auto& app : appList) {
			LOG_DEBUG("name : {}", app.name);
			LOG_DEBUG("file : {}", app.file);
			LOG_DEBUG("cmd : {}", app.cmd);
			LOG_DEBUG("");
		}
	}
public:
	std::vector<App> appList;
private:
	std::string configPath_;
};

#endif //CONFIG_HPP_
